#pragma once
namespace graph
{
typedef unsigned long graph_id_t;
typedef unsigned long vertex_in_graph_id_t;
typedef float lat_lon_t;
typedef size_t vertex_id_t;

struct point_t
{
   point_t(lat_lon_t lat, lat_lon_t lon)
      :  lat_(lat)
      ,  lon_(lon)
   {}
   point_t()
   {}
   lat_lon_t lat_;
   lat_lon_t lon_;
};
typedef std::pair<vertex_id_t, vertex_id_t> vertex_id_pair_t;
typedef std::pair<point_t, point_t> point_pair_t;
typedef char high_way_t;
typedef std::map<std::string, high_way_t> high_way_dict_t;
typedef unsigned long graph_int_t;
typedef std::pair<char, char> vertex_edge_types_t;

//GRAPH EDGES AND VERTICES DATA CONSTANTS
std::string static const ONEWAY_YES("yes");
std::string static const ONEWAY_NO("no");
std::string static const ONEWAY_REVERSE("-1");

std::string static const PATH_TYPE_NONE("none"); //const that means - nothing processed yet
std::string static const PATH_TYPE_ALL("all");
std::string static const PATH_TYPE_MOTOR("motor");
std::string static const PATH_TYPE_BICYCLE("bicycle");
std::string static const PATH_TYPE_FOOT("foot");

std::string static const MOTORWAY_WAY_TAG("motorway");
std::string static const TRUNK_WAY_TAG("trunk");
std::string static const PRIMARY_WAY_TAG("primary");
std::string static const SECONDARY_WAY_TAG("secondary");
std::string static const TERTIARY_WAY_TAG("tertiary");
std::string static const UNCLASSIFIED_WAY_TAG("unclassified");
std::string static const RESIDENTIAL_WAY_TAG("residential");
std::string static const LIVING_STREET_WAY_TAG("living_street");
std::string static const ROAD_WAY_TAG("road");
std::string static const PEDESTRIAN_WAY_TAG("pedestrian");
std::string static const PATH_WAY_TAG("path");
std::string static const BRIDLEWAY_WAY_TAG("bridleway");
std::string static const CYCLEWAY_WAY_TAG("cycleway");
std::string static const FOOTWAY_WAY_TAG("footway");

high_way_t static const UDEFINED_KEY(0);
high_way_t static const MOTORWAY_WAY_KEY(1);
high_way_t static const TRUNK_WAY_KEY(2);
high_way_t static const PRIMARY_WAY_KEY(3);
high_way_t static const SECONDARY_WAY_KEY(4);
high_way_t static const TERTIARY_WAY_KEY(5);
high_way_t static const UNCLASSIFIED_WAY_KEY(6);
high_way_t static const RESIDENTIAL_WAY_KEY(7);
high_way_t static const LIVING_STREET_WAY_KEY(8);
high_way_t static const ROAD_WAY_KEY(9);
high_way_t static const PEDESTRIAN_WAY_KEY(10);
high_way_t static const PATH_WAY_KEY(11);
high_way_t static const BRIDLEWAY_WAY_KEY(12);
high_way_t static const CYCLEWAY_WAY_KEY(13);
high_way_t static const FOOTWAY_WAY_KEY(14);

static lat_lon_t const MAX_FLOAT = std::numeric_limits<lat_lon_t>::max();

//ERROR CODES
static int const PATH_NOT_FOUND_ERROR = 1;
static int const NO_VERTICES_NEAR_GIVEN_POINTS_ERROR = 2;
}
